LawrencePeng's Blog

专注收集代码小精灵

Vectorization in Java9

最近小忙,这次水一波。

Finally, HotSpot终于能比较好的利用现代CPU的SIMD了。

  • 现况
    1. Hotspot 支持一部分的x86 SIMD指令。
    2. C2能做Superword Optimaztion。
    3. 数组的拷贝、填充、比较都默认SIMD化了。
  • JVM Intrinsics
    • @HotSpotIntrinsicCandidate说明函数实现被JVM用手写汇编或者IR优化了。
  • 已经被优化的:

    • 除了上面说的还有Arrays.equals();
    • Array.mismatch()(Java9)。
  • SuperWord Optimzation

    • 只在C2

    • 只能在unrolled的counted循环做优化。

      • Counted 循环 是是只有单出口的循环。

      • 1
        2
        3
        4
        5
        6
        7
        for (int i = start; i < limit; i+=stride) {
        // loop body
        }
        int i = start; while (i < limit) {
        // loop body
        i+=stride;
        }
      • 可以使用-XX:+PrintCompilation -XX:+TraceLoopOpts查看,或者-XX:+PrintAssembly看生成的代码。

        • Counted Loop: N100/N83 limit_check predicated counted [0,100),+1 (-1 iters)
    • Vector Box Elimination

      • 目前还比较brittle。
      • 这种优化只能解决一些问题,不是通用的优化。
      • JNI很难开发和维护。

  • 注意,手动unroll的代码是不能向量化的。
  • Hotspot团队的实验:
    • X86性能优化大概3-8%。
    • 1.5X的性能提升在vector centric micros。